/*
 * xColor.h
 *
 *  Created on: 2011-3-26
 *      Author: wangchao
 */

#ifndef XCOLOR_H_
#define XCOLOR_H_

/*
 #define COLOR_R( col ) (col&0xFF)
 #define COLOR_G( col ) ((col>>8)&0xFF)
 #define COLOR_B( col ) ((col>>16)&0xFF)
 #define COLOR_A( col ) ((col>>24)&0xFF)
 #define COLOR( r,g,b, a) ( (r) | ((g)<<8) | ((b)<<16) |((a) <<24))
 */

class fColor
{
public:
    typedef unsigned int COLOR_TYPE;
    typedef unsigned char COLOR_COMPONENT;

public:
    fColor( )
    {
        _color._color_int = 0;
    }

    fColor( COLOR_TYPE color )
    {
        _color._color_int = color;
    }

    fColor( COLOR_COMPONENT r, COLOR_COMPONENT g, COLOR_COMPONENT b )
    {
        _color._color_struct.a = 0;
        _color._color_struct.r = r;
        _color._color_struct.g = g;
        _color._color_struct.b = b;
    }

    fColor( COLOR_COMPONENT r, COLOR_COMPONENT g, COLOR_COMPONENT b, COLOR_COMPONENT a )
    {
        _color._color_struct.a = a;
        _color._color_struct.r = r;
        _color._color_struct.g = g;
        _color._color_struct.b = b;
    }
public:
    const fColor& operator=( const fColor& color )
    {
        if( this != &color )
        {
            _color._color_int = color._color._color_int;
        }
        return *this;
    }
    const fColor& operator=( COLOR_TYPE color )
    {
        _color._color_int = color;
        return *this;
    }
#if 0
    const fColor& operator=( COLOR_COMPONENT components[4] )
    {
        _color._color_struct.a = components[0];
        _color._color_struct.r = components[1];
        _color._color_struct.g = components[2];
        _color._color_struct.b = components[3];

        return *this;
    }
#endif
    fColor( const fColor& color )
    {
        _color._color_int = color._color._color_int;
    }

    operator COLOR_TYPE( )
    {
        return _color._color_int;
    }
public:
    void ColorWithComment( COLOR_COMPONENT comment )
    {
        _color._color_struct.b = comment;
        _color._color_struct.g = comment;
        _color._color_struct.r = comment;
        _color._color_struct.a = 0;
    }

    void Translate( )
    {
        _color._color_struct.a = 0xFF;
    }

    bool IsTranslate( )
    {
        return _color._color_struct.a == 0xFF;
    }
public:
    COLOR_COMPONENT Red( ) const
    {
        return _color._color_struct.r;
    }

    COLOR_COMPONENT Blue( ) const
    {
        return _color._color_struct.b;
    }

    COLOR_COMPONENT Green( ) const
    {
        return _color._color_struct.g;
    }
    COLOR_COMPONENT Alpha( ) const
    {
        return _color._color_struct.a;
    }
    COLOR_TYPE Value( ) const
    {
        return _color._color_int;
    }

    COLOR_COMPONENT& Red( )
    {
        return _color._color_struct.r;
    }

    COLOR_COMPONENT& Blue( )
    {
        return _color._color_struct.b;
    }

    COLOR_COMPONENT& Green( )
    {
        return _color._color_struct.g;
    }
    COLOR_COMPONENT& Alpha( )
    {
        return _color._color_struct.a;
    }
    COLOR_TYPE& Value( )
    {
        return _color._color_int;
    }
protected:
    union
    {
        COLOR_TYPE _color_int;
        struct
        {
            COLOR_COMPONENT b, g, r, a;
        } _color_struct;
    } _color;
};

#endif /* XCOLOR_H_ */
